SelectStmt:
SelectStmtBasic OrderByOptional SelectStmtLimit
| SelectStmtFromDualTable OrderByOptional SelectStmtLimit
| SelectStmtFromTable OrderByOptional SelectStmtLimit
SelectStmtFromTable:
SelectStmtBasic "FROM" TableRefsClause WhereClauseOptional SelectStmtGroup HavingClause
SelectStmtBasic:
"SELECT" SelectStmtOpts SelectStmtFieldList
SelectStmtOpts:
DefaultFalseDistinctOpt SelectStmtStraightJoin
DefaultFalseDistinctOpt:
/* empty */ // Default false
| DistinctOpt
DefaultTrueDistinctOpt:
/* empty */ // Default true
| DistinctOpt
DistinctOpt:
"ALL"
| DistinctKwd
DistinctKwd:
"DISTINCT"
| "DISTINCTROW"
SelectStmtStraightJoin:
/* empty */
| "STRAIGHT_JOIN"
SelectStmtFieldList:
FieldList
FieldList:
Field
| FieldList ',' Field
Field:
'*'
| Identifier '.' '*'
| Expression
OrderByOptional:
/* empty */
| OrderBy
OrderBy:
"ORDER" "BY" ByList
ByList:
ByItem
| ByList ',' ByItem
ByItem:
Expression Order
Order:
/* empty */
| "ASC"
| "DESC"
SelectStmtLimit:
/* empty */
| "LIMIT" LimitOption
| "LIMIT" LimitOption ',' LimitOption
| "LIMIT" LimitOption "OFFSET" LimitOption
LimitOption:
LengthNum
LengthNum:
NUM
NUM:
intLit
SelectStmtFromDualTable:
SelectStmtBasic FromDual WhereClauseOptional
FromDual:
"FROM" "DUAL"
WhereClauseOptional:
/* empty */
| WhereClause
WhereClause:
"WHERE" Expression
TableRefsClause:
TableRefs
TableRefs:
EscapedTableRef
| TableRefs ',' EscapedTableRef
EscapedTableRef:
TableRef
TableRef:
TableFactor
| JoinTable
TableFactor:
TableName TableAsNameOpt
| '(' SelectStmt ')' TableAsName
| '(' SetOprStmt ')' TableAsName
| '(' TableRefs ')'
TableName:
Identifier
TableAsNameOpt:
/* empty */
| TableAsName
TableAsName:
Identifier
| "AS" Identifier
JoinTable:
TableRef CrossOpt TableRef
| TableRef CrossOpt TableRef "ON" Expression
| TableRef CrossOpt TableRef "USING" '(' ColumnNameList ')'
| TableRef JoinType OuterOpt "JOIN" TableRef "ON" Expression
| TableRef JoinType OuterOpt "JOIN" TableRef "USING" '(' ColumnNameList ')'
| TableRef "NATURAL" "JOIN" TableRef
| TableRef "NATURAL" JoinType OuterOpt "JOIN" TableRef
| TableRef "STRAIGHT_JOIN" TableRef
| TableRef "STRAIGHT_JOIN" TableRef "ON" Expression
CrossOpt:
"JOIN"
| "CROSS" "JOIN"
| "INNER" "JOIN"
ColumnNameList:
ColumnName
| ColumnNameList ',' ColumnName
ColumnName:
Identifier
| Identifier '.' Identifier
JoinType:
"LEFT"
| "RIGHT"
OuterOpt:
/* empty */
| "OUTER"
SetOprStmt:
SetOprClauseList SetOpr SelectStmtBasic OrderByOptional SelectStmtLimit
| SetOprClauseList SetOpr SelectStmtFromDualTable OrderByOptional SelectStmtLimit
| SetOprClauseList SetOpr SelectStmtFromTable OrderByOptional SelectStmtLimit
| SetOprClauseList SetOpr '(' SelectStmt ')' OrderByOptional SelectStmtLimit
SetOprClauseList:
SetOprSelect
| SetOprClauseList SetOpr SetOprSelect
SetOprSelect:
SelectStmt
| '(' SelectStmt ')'
SetOpr:
"UNION" UnionOpt
UnionOpt:
DefaultTrueDistinctOpt
SelectStmtGroup:
/* empty */
| GroupByClause
GroupByClause:
"GROUP" "BY" ByList
HavingClause:
/* empty */
| "HAVING" Expression